package com.rose.config;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@ControllerAdvice
public class ExceptionResolver {

    // 触发禁止访问受保护资源异常，返回登陆页面
    /*      这里使用@ExceptionHandler注解捕捉异常在访问/admin/main/page.html时不会进入该方法
            原因是：上面的视图是在mvc的配置文件中用mvc:view-controller修饰的，这种页面，会使用默认的异常处理器
            而不是使用自定义处理器，
            因此这里必须通过mvc配置文件来配置异常映射，或不使用view-controller，而是把页面跳转放在Controller中。*/
//    @ExceptionHandler(value = AccessForbiddenException.class)
//    public ModelAndView resolverAccessForbiddenException(
//            AccessForbiddenException exception, HttpServletRequest request,
//            HttpServletResponse response) throws IOException {
//        String viewName = "admin-login";
//        return commonCode(exception,request,response,viewName);
//    }

    @ExceptionHandler({AccessForbiddenException.class})
    public ModelAndView handlerException(Exception e) {
        ModelAndView mv = new ModelAndView("admin-login");//要跳转的页面
        mv.addObject("exception", e);//要传的参数的key
        return mv;
    }

    // 整理出的不同异常的可重用代码  将共有的代码插取出来
    private ModelAndView commonCode(
            //触发的异常，此处借助多态
            Exception exception,
            //客户器端的请求
            HttpServletRequest request,
            //服务端的响应
            HttpServletResponse response,
            //指定普通页面请求时，去的错误页面
            String viewName
    ) throws IOException {

            //if判断-是普通页面请求
            //创建ModelAndView对象
            ModelAndView modelAndView = new ModelAndView();

            //设置触发异常跳转的页面（会自动被视图解析器加上前后缀）
            //前后缀分别是这样的
//          <property name="prefix" value="/WEB-INF/"/>
//          <property name="suffix" value=".jsp"/>

            //使用ModelAndView对象进行转发，默认使用forward转发
            modelAndView.setViewName(viewName);
            //将异常信息加入
            // request 与 HttpServletRequest什么关系，有点不懂呐
            //下面这行是不是等同于 request.setAttribute  这个是不是jsp里面的对象方法
            modelAndView.addObject("exception", exception);
            //返回设置完成的ModelAndView
            return modelAndView;
        }



}


